﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; // 可选，用于更灵活的JSON解析

namespace CallApi_AI
{
    public partial class Form_Main : Form
    {        
        // API配置
        //private string _apiKey = "sk-09cc1b85c4404df6a1986cf5ef147f83"; // 在这里输入你的API密钥
        private string _apiKey = "sk-gaaxbjkqgxziiclhhiteuyeyiraqvcbgwdgoqadslnymktjo"; // 在这里输入你的API密钥

        //private string _apiUrl = "https://api.deepseek.com/v1/chat/completions";// DeepSeek API地址
        private string _apiUrl = "https://api.siliconflow.cn/v1/chat/completions";
        private string _model = "Qwen/Qwen2.5-VL-72B-Instruct";
        
        // HTTP客户端
        private readonly HttpClient _httpClient = new HttpClient();

        public Form_Main()
        {
            InitializeComponent();
            initialInfo();
            InitializeHttpClient();
        }
        private void initialInfo()
        {
            textBox_ApiKey.Text = _apiKey;
            textBox_ApiUrl.Text = _apiUrl;
            //textBox_Send.Text = "武汉市具体有哪些县?";
            textBox_Send.Text = "根据当前的国际形势（军事政治等），请帮我仔细分析未来一周的黄金价格";
            textBox_Model.Text = _model;
        }
        private async void button_Send_Click(object sender, EventArgs e)
        {
            // 调用AI API的异步方法（传入输入框和输出框控件）
            await SendRequestAsync(textBox_Send.Text, richTextBox_Output);
        }
        // 初始化HTTP客户端
        private void InitializeHttpClient()
        {
            _httpClient.Timeout = TimeSpan.FromMinutes(5); // 设置超时时间
        }
        // 发送请求到AI API
        private async Task SendRequestAsync(string userInput, RichTextBox outputTextBox)
        {
            if (string.IsNullOrEmpty(userInput))
            {
                MessageBox.Show("请输入内容后再发送", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            userInput = userInput.Trim();

            if (string.IsNullOrEmpty(_apiKey))
            {
                MessageBox.Show("请先设置API密钥", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                // 显示临时状态
                outputTextBox.AppendText($"你：{userInput}\n\n");
                outputTextBox.AppendText("AI正在生成回答...\n\n");

                this.Cursor = Cursors.WaitCursor;

                // 2. 构建请求内容（匿名对象，严格匹配API格式）
                var requestBody = new
                {
                    //model = "Qwen/Qwen2.5-VL-72B-Instruct", // 模型名称（必须与API文档一致）
                    model = _model,// 模型名称（必须与API文档一致）
                    messages = new List<object> // 使用List确保兼容性（避免数组语法问题）
                    {
                        new { role = "user", content = userInput } // 角色和内容（必填字段）
                    },
                    temperature = 0.7, // 随机性参数（0-1）
                    stream= false,
                    max_tokens = 4096, // 最大响应长度
                    enable_thinking = true, // 深度思考
                    thinking_budget = 4096
                };

                // 3. 序列化请求内容（使用Newtonsoft.Json）
                string jsonContent;
                try
                {
                    // 序列化时禁用格式化（减少网络传输量）
                    jsonContent = JsonConvert.SerializeObject(requestBody, Formatting.None);
                }
                catch (JsonSerializationException ex)
                {
                    outputTextBox.AppendText($"序列化失败：{ex.Message}\n");
                    return;
                }

                // 4. 构建HTTP请求内容
                var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

                // 5. 设置请求头（认证信息）
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _apiKey);

                // 6. 发送请求
                //HttpResponseMessage response = await _httpClient.PostAsync(_apiUrl, httpContent);
                var response = await _httpClient.PostAsync(_apiUrl, httpContent); // httpContent是请求体
                response.EnsureSuccessStatusCode(); // 验证HTTP状态码（非4xx/5xx）

                // 7. 解析响应
                string responseBody = await response.Content.ReadAsStringAsync();
                JObject jsonResponse = JObject.Parse(responseBody); // 解析JSON
                string aiResponse = jsonResponse["choices"][0]["message"]["content"].ToString();

                // 8. 显示结果
                //outputTextBox.Clear();
                //outputTextBox.AppendText($"你：{userInput}\n\n");
                outputTextBox.AppendText($"AI：{aiResponse}\n\n");
            }
            catch (HttpRequestException ex)
            {
                outputTextBox.AppendText($"网络请求错误：{ex.Message}\n（可能是API地址错误或网络不通）\n\n");
            }
            catch (KeyNotFoundException ex)
            {
                outputTextBox.AppendText($"响应格式错误：{ex.Message}\n（可能API返回结构与预期不符）\n\n");
            }
            catch (Exception ex)
            {
                outputTextBox.AppendText($"未知错误：{ex.Message}\n\n");
            }
            finally
            {
                this.Cursor = Cursors.Default; // 恢复光标
            }
        }
        private void textBox_TextChanged(object sender, EventArgs e)
        {
            TextBox textBox = sender as TextBox;
            if (textBox == null) { return; }

            switch(textBox.Name)
            {
                case "textBox_ApiKey":
                    {
                        _apiKey = textBox.Text;
                        break;
                    }
                case "textBox_ApiUrl":
                    {
                        _apiUrl = textBox.Text;
                        break;
                    }
                case "textBox_Model":
                    {
                        _model = textBox_Model.Text;
                        break;
                    }
            }
        }
    }
}
